package org.example.leetCode;

/**
 * 125. 验证回文串
 * 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
 * 字母和数字都属于字母数字字符。
 * 给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。
 */
public class Code125 {
    /**
     * 现在原数组中替换，然后通过反置字符串，比较是否相同
     *
     * @param s 待比较的字符串
     * @return 比较结果
     */
    public boolean isPalindrome(String s) {
        if (s == null || s.isEmpty()) {
            return true;
        }
        StringBuilder str = new StringBuilder();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9')) {
                if ('A' <= ch && ch <= 'Z') {
                    ch = (char) (ch + 32);
                }
                str.append(ch);
            }
        }
        if (str.toString().isEmpty() || str.toString().contentEquals(str.reverse())) {
            return true;
        }
        return false;

    }

    /**
     * 将大写换成小写，直接比较，不做替换
     *
     * @param s 待比较的字符串
     * @return 比较结果
     */
    public boolean isPalindrome1(String s) {
        s = s.toLowerCase();
        char[] ch = s.toCharArray();
        int i = 0, j = ch.length - 1;
        while (i < j) {
            if (!(('a' <= ch[i] && ch[i] <= 'z') || ('0' <= ch[i] && ch[i] <= '9'))) {
                i++;
                continue;
            }
            if (!(('a' <= ch[j] && ch[j] <= 'z') || ('0' <= ch[j] && ch[j] <= '9'))) {
                j--;
                continue;
            }
            if (ch[i] != ch[j]) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

    public static void main(String[] args) {
        Code125 solution = new Code125();

        // 测试用例 1: 是回文串
        String s1 = "A man, a plan, a canal: Panama";
        System.out.println("测试用例 1: " + solution.isPalindrome(s1)); // 预期输出 true

        // 测试用例 2: 不是回文串
        String s2 = "race a car";
        System.out.println("测试用例 2: " + solution.isPalindrome(s2)); // 预期输出 false

        // 测试用例 3: 空字符串
        String s3 = "";
        System.out.println("测试用例 3: " + solution.isPalindrome(s3)); // 预期输出 true

        // 测试用例 4: 只有非字母数字字符
        String s4 = "!!!";
        System.out.println("测试用例 4: " + solution.isPalindrome(s4)); // 预期输出 true

        // 测试用例 5: 单个字符
        String s5 = "a";
        System.out.println("测试用例 5: " + solution.isPalindrome(s5)); // 预期输出 true

        // 测试用例 6: 包含大写字母和空格
        String s6 = "0P";
        System.out.println("测试用例 6: " + solution.isPalindrome(s6)); // 预期输出 true
    }


}
